package cn.toprog.viewer.component;

import java.io.File;
import java.nio.file.Files;
import javafx.event.EventHandler;
import javafx.scene.control.TreeItem;

/**
 * 项目名称: TaoImagerViewer
 * 创建时间: 2021/4/7 23:01
 * 作者姓名: xiaolei
 */

/**
 * 代表目录节点的Item
 */
public class FolderTreeItem extends TreeItem<File> {
    private boolean notChildrenLoaded = true; // 代表当前节点对象的子节点是否已经加载
    private boolean isRoot;                   // 该节点的目录对象是否是顶层

    public FolderTreeItem(File file, boolean isRoot) {
        super(file);
        this.isRoot = isRoot;
    }

    // 加载当前节点的子节点
    public void loadChildren() {
        if (notChildrenLoaded) {
            notChildrenLoaded = false;

            File[] children = null;

            if (!isRoot) {
                File dir = this.getValue();
                children = dir.listFiles();
            } else {
                children = File.listRoots();
            }
            // 如果获得的目录内容为null, 直接返回
            if (children == null) {
                return;
            }
            // 依次处理所有子目录及文件
            for (File child : children) {
                if (child.isDirectory() && (isRoot || !child.isHidden()) && Files.isReadable(child.toPath())) {
                    FolderTreeItem item = new FolderTreeItem(child, false);

                    // 为TreeItem增加事件处理，处理的事件是TreeItem展开，
                    // 当展开一个TreeItem时，加载其所有子节点的子节点
                    item.addEventHandler(FolderTreeItem.branchExpandedEvent(),
                            new EventHandler<TreeModificationEvent<File>>() {

                                @Override
                                public void handle(TreeModificationEvent<File> event) {
                                    for (TreeItem<File> child : event.getSource().getChildren()) {
                                        ((FolderTreeItem) child).loadChildren();
                                    }
                                }

                            });

                    this.getChildren().add(item);
                } // end of if
            } // end of for
        } // end of if
    }
} // end of class FolderTreeITem
